const str = ':中文测试wifi,a123456,0';

// 转为 utf-8，但是先编码
const decode1 = (command1: string) => {
    const command = encodeURIComponent(command1);
    const buffer = new ArrayBuffer(command.length);
    const dataView = new DataView(buffer);
    for (let i = 0; i < command.length; i++) {
        dataView.setUint8(i, command.charCodeAt(i));
    }
    return dataView;
}

// 转为 utf-16
const decode3 = (command: string) => {
    const buffer = new ArrayBuffer(command.length);
    const dataView = new DataView(buffer);
    for (let i = 0; i < command.length; i++) {
        dataView.setUint8(i, command.charCodeAt(i));
    }
    return dataView;
}

// 直接得到utf-8编码
const decode2 = (command: string) => {
    const encoder = new TextEncoder();
    const buffer = encoder.encode(command); // 直接得到 UTF-8 编码的 Uint8Array
    const dataView = new DataView(buffer.buffer);
    return dataView;
}

/**
     * 将中文字符串转换为UTF-8字节数组（兼容无TextEncoder的环境）
     * @param {string} str - 要编码的字符串（支持中文）
     * @returns {ArrayBuffer} UTF-8字节数组
     */
const stringToUtf8Bytes = (str: string): ArrayBuffer => {
    const bytes = [];
    for (let i = 0; i < str.length; i++) {
        let charCode = str.charCodeAt(i);

        // 处理单字节字符（0-127）
        if (charCode <= 0x7F) {
            bytes.push(charCode);
        }
        // 处理双字节字符（128-2047）
        else if (charCode <= 0x7FF) {
            bytes.push(0xC0 | (charCode >>> 6));         // 第一个字节：110xxxxx
            bytes.push(0x80 | (charCode & 0x3F));       // 第二个字节：10xxxxxx
        }
        // 处理三字节字符（2048-65535）
        else if (charCode <= 0xFFFF) {
            bytes.push(0xE0 | (charCode >>> 12));        // 第一个字节：1110xxxx
            bytes.push(0x80 | ((charCode >>> 6) & 0x3F)); // 第二个字节：10xxxxxx
            bytes.push(0x80 | (charCode & 0x3F));        // 第三个字节：10xxxxxx
        }
        // 处理四字节字符（UTF-16代理对，65536-1114111）
        else {
            // 转换为UTF-32编码
            charCode -= 0x10000;
            bytes.push(0xF0 | (charCode >>> 18));         // 第一个字节：11110xxx
            bytes.push(0x80 | ((charCode >>> 12) & 0x3F)); // 第二个字节：10xxxxxx
            bytes.push(0x80 | ((charCode >>> 6) & 0x3F));  // 第三个字节：10xxxxxx
            bytes.push(0x80 | (charCode & 0x3F));         // 第四个字节：10xxxxxx
            i++; // 跳过代理对的第二个字符
        }
    }
    
    const uint8Array = new Uint8Array(bytes); // 转换为 Uint8Array
    const buffer = uint8Array.buffer;				// 传递的二进制数据
    const dataView = new DataView(uint8Array.buffer); // 基于缓冲区创建 DataView
    return buffer;
}


// 将dataView转为16进制字符串
const dataViewToHex = (dataView: DataView, pre = '0x', seprator = ',') => {
    let hexString = '';
    // 遍历 DataView 中的每个字节
    for (let i = 0; i < dataView.byteLength; i++) {
        // 读取当前字节的无符号整数（0-255）
        const byte = dataView.getUint8(i);
        // 转换为 16 进制，不足两位则补前导零
        const hex = byte.toString(16).padStart(2, '0');
        // 拼接（可根据需要转为大写，如 hex.toUpperCase()）
        hexString += (pre + hex + seprator);
    }
    return hexString;
}

console.log(dataViewToHex(decode1(str)));
console.log(dataViewToHex(decode3(str)));
console.log(dataViewToHex(decode2(str)));

